/**
 * ControladoraRegistroNotas.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.negocios;

import java.sql.Date;
import java.util.Calendar;
import java.util.Iterator;
import java.util.LinkedList;
import adsec.datos.ControladoraBDRegistroNotas;
import adsec.entidades.Acta;
import adsec.entidades.Anio;
import adsec.entidades.Docente;
import adsec.entidades.GridRegistroNotasAnual;
import adsec.entidades.GridRegistroNotasPeriodo;
import adsec.entidades.InfoAnualActa;
import adsec.entidades.InfoPeriodoActa;
import adsec.entidades.MateriaCursada;
import adsec.entidades.MatriculaEstudiante;
import adsec.entidades.Nivel;
import adsec.entidades.NotasPeriodoActa;
import adsec.entidades.Perfil;
import adsec.entidades.Seccion;
import adsec.entidades.Usuario;


public class ControladoraRegistroNotas {
    ControladoraBDRegistroNotas contBD;

    public ControladoraRegistroNotas(){
        contBD = new ControladoraBDRegistroNotas();
    }

    public LinkedList<Anio> consultarAños(){
        return new ControladoraAnio().consultarAnios();
    }

    public LinkedList<Nivel> consultarNiveles(){
        return new ControladoraNivel().consultarNivelesTodos();
    }

    public LinkedList<MateriaCursada> consultarMaterias(int año, int nivel){
        return new ControladoraMateriaCursada().consultarMateriasCursadas(año, nivel);
    }

    public LinkedList<Seccion> consultarSecciones(int año, int nivel){
        return new ControladoraSeccion().consultarSecciones(año, nivel);
    }

    public LinkedList<GridRegistroNotasPeriodo> consultarRegistroNotasPeriodo(Seccion seccion, int periodo, MateriaCursada materia){
        return contBD.consultarRegistroNotasPeriodo(seccion, periodo, materia);
    }

    public LinkedList<GridRegistroNotasPeriodo> consultarRegistroNotasPeriodoNoCreados(Seccion seccion, int periodo, MateriaCursada materia){
        return contBD.consultarRegistroNotasPeriodoNoCreados(seccion, periodo, materia);
    }

    public int insertarRegistroNotas(Acta acta, InfoPeriodoActa infoPeriodo, LinkedList<NotasPeriodoActa> listaNotasPeriodoActa){
        return this.contBD.insertarRegistroNotas(acta, infoPeriodo, listaNotasPeriodoActa);
    }

    public int insertarRegistroNotas(InfoPeriodoActa infoPeriodo, LinkedList<NotasPeriodoActa> listaNotasPeriodoActa){
        return this.contBD.insertarRegistroNotas(infoPeriodo, listaNotasPeriodoActa);
    }

    public int modificarRegistroNotas(InfoPeriodoActa infoPeriodo, LinkedList<NotasPeriodoActa> listaNotasPeriodoActa){
        return this.contBD.modificarRegistroNotas(infoPeriodo, listaNotasPeriodoActa);
    }

    public int eliminarRegistroNotas(InfoPeriodoActa infoPeriodoActa){
        return this.contBD.eliminarRegistroNotas(infoPeriodoActa);
    }

    public Docente consultarDatosDocenteImparte(Seccion seccion, MateriaCursada materia){
        ControladoraDocenteImparte contDocImparte = new ControladoraDocenteImparte();
        return contDocImparte.consultarDatosDocenteImparte(seccion, materia);
    }

    public int existeRegistroNotasMatricula(MatriculaEstudiante registro){
        return this.contBD.existeRegistroNotasMatricula(registro);
    }

    public boolean puedeIME(Usuario usuario, Perfil perfil, String cedulaDocente){
        boolean tienePermiso = perfil.getNombre().equals(Perfil.PERFIL_ADMINISTRADOR);
        if( !tienePermiso && perfil.getNombre().equals(Perfil.PERFIL_DOCENTE) ){
            if( usuario.getTipo() == Usuario.CEDULA_DOCENTE ){
                tienePermiso = cedulaDocente.equals(usuario.getCedulaDocente());
            }
        }//fin de if
        return tienePermiso;
    }//fin de puedeIME

    /*
     * Verifica si todas las actas por periodo del acta identificada por idActa
     * están cerradas.
     */
    public boolean cumpleRequisitosParaActaAnual(int idActa, int cantidadPeriodos){
        boolean cumple = false;
        LinkedList<InfoPeriodoActa> listaInfoPeriodoActa = this.contBD.consultarListaInfoPeriodoActa(idActa);
        if(listaInfoPeriodoActa.size() == cantidadPeriodos){
            Iterator<InfoPeriodoActa> iterador = listaInfoPeriodoActa.iterator();
            int cerrados = 0;
            while(iterador.hasNext()){
                Date fecha = iterador.next().getFechaCierre();
                cerrados += UtilidadesCapaNegocios.esFechaNula(fecha) ? 0 : 1;
            }
            cumple = cerrados == cantidadPeriodos;
        }
        return cumple;
    }//fin de cumpleRequisitosParaActaAnual

    /*
     * Consulta el acta por año, nivel, seccion, materia.
     * El parámetro Seccion encapsula el año y nivel.
     */
    public Acta consultarActa(Seccion seccion, MateriaCursada materia){
        Acta acta = contBD.consultarActa(seccion, materia);
        return acta;
    }

    /*
     * Cerrar o abrir acta por periodo
     *
     */
    public int cerrarAbrirActaPeriodo(int idInfoPeriodoActa, int operacion){
        //La acción más común es cerrar.
        Calendar calendario = Calendar.getInstance();
        Date fecha = new Date(calendario.getTimeInMillis());
        if(operacion == UtilidadesCapaNegocios.opAbrirActa){
            fecha = UtilidadesCapaNegocios.getFechaNula();
        }
        int resultado = contBD.cerrarAbrirActaPeriodo(fecha, idInfoPeriodoActa);
        return resultado;
    }

    public InfoAnualActa consultarInfoAnualActa(int idActa){
        InfoAnualActa actaAnual = contBD.consultarInfoAnualActa(idActa);
        return actaAnual;
    }

    public LinkedList<GridRegistroNotasAnual> consultarRegistroNotasAnual(int idActa){
        return contBD.consultarRegistroNotasAnual(idActa);
    }

    public LinkedList<GridRegistroNotasAnual> consultarRegistroNotasAnualNoCreados(int idActa){
        return contBD.consultarRegistroNotasAnualNoCreados(idActa);
    }

    public boolean existeActaPeriodo(Seccion seccion, MateriaCursada materia, int periodo){
        return contBD.existeActaPeriodo(seccion, materia, periodo);
    }

    public int insertarRegistroNotasAnual(InfoAnualActa infoAnualActa, LinkedList<GridRegistroNotasAnual> listaNotasPeriodoActa){
        return this.contBD.insertarRegistroNotasAnual(infoAnualActa, listaNotasPeriodoActa);
    }

    public int modificarRegistroNotasAnual(InfoAnualActa infoAnualActa, LinkedList<GridRegistroNotasAnual> listaNotasAnualActa){
        return this.contBD.modificarRegistroNotasAnual(infoAnualActa, listaNotasAnualActa);
    }

    public int eliminarRegistroNotasAnual(InfoAnualActa infoAnualActa){
        return this.contBD.eliminarRegistroNotasAnual(infoAnualActa);
    }

    /*
     * Cerrar o abrir acta anual
     *
     */
    public int cerrarAbrirActaAnual(int idInfoAnualActa, int operacion){
        //La acción más común es cerrar.
        Calendar calendario = Calendar.getInstance();
        Date fecha = new Date(calendario.getTimeInMillis());
        if(operacion == UtilidadesCapaNegocios.opAbrirActa){
            fecha = UtilidadesCapaNegocios.getFechaNula();
        }
        int resultado = contBD.cerrarAbrirActaAnual(fecha, idInfoAnualActa);
        return resultado;
    }

    public String consultarNombreRealUsuarioActual(){
        ControladoraUsuario contUsuario = new ControladoraUsuario();
        AdministradorSeguridad adminSeguridad = AdministradorSeguridad.getInstancia();
        return contUsuario.consultarNombreRealUsuario(adminSeguridad.getUsuario().getIdUsuario());
    }
}// fin de ControladoraRegistroNotas
